//
//  CustomLayout.m
//  Hero
//
//  Created by lanou3g on 16/5/10.
//  Copyright © 2016年 刘永庆. All rights reserved.
//

#import "CustomLayout.h"

//第三步:设置相关的不暴露外边的属性,只有当前文件使用
@interface CustomLayout ()
///获取item的总数量
@property(nonatomic,assign)NSInteger numberOfItems;
///存储每一列高度的数组
@property(nonatomic,strong)NSMutableArray *columnHeights;
///存储距离上下左右的数组
@property(nonatomic,strong)NSMutableArray *itemAtrributes;
///存储item的x值
@property(nonatomic,assign)CGFloat detalX;
///存储item相对应的y值
@property(nonatomic,assign)CGFloat detalY;
///记录最短的列
@property(nonatomic,assign)NSInteger shortesIndex;
///获取最长列的索引值
- (NSInteger)p_indexForLongestColumn;
///获取最短列的索引值
- (NSInteger)p_indexForShortestColumn;
@end
@implementation CustomLayout
//第四步:懒加载一些数据源
-(NSMutableArray *)columnHeights
{
    if (!_columnHeights) {
        _columnHeights = [NSMutableArray array];
    }
    return _columnHeights;
}
-(NSMutableArray *)itemAtrributes
{
    if (!_itemAtrributes) {
        _itemAtrributes = [NSMutableArray array];
    }
    return _itemAtrributes;
}
//第五步：实现获取最长列的方法
- (NSInteger)p_indexForLongestColumn{
    //定义一个变量用于记录哪一列是最长列
    NSInteger longestIndex = 0;
    //当前最长列的一个高度
    CGFloat longestHeight = 0;
    //遍历数组取出相关数据然后返回
    for (int i = 0; i < self.numberOfColumns; i++) {
        //获取相关的一个高度
        CGFloat currentHeight = [self.columnHeights[i] floatValue];
        //判断选出最高的一个高度
        if (currentHeight > longestHeight) {
            longestHeight = currentHeight;
            longestIndex = i;
        }
    }
    return longestIndex;
}
//第六步：实现获取最短列的一个方法
- (NSInteger)p_indexForShortestColumn{
    
    //记录索引
    NSInteger shortestIndex = 0;
    //记录最小的一个高度
    CGFloat shortestHeight = MAXFLOAT;
    //遍历赋值取出最小的下标
    for (int i = 0; i < self.numberOfColumns; i++) {
        //获取一个当前高度
        CGFloat currentHeight = [self.columnHeights[i] floatValue];
        if (currentHeight < shortestHeight) {
            shortestHeight = currentHeight;
            shortestIndex = i;
        }
    }
    return shortestIndex;
}
//第七步：实现给每一列添加top高度
- (void)addHeightWithColumns{
    //遍历取出相关的数值
    for (int i = 0;i < self.numberOfColumns;i++){
        self.columnHeights[i] = @(self.sectionInsets.top);
    }
}
//第八步：查找最短的列，并设置相关属性
// 查找最短的列，并设置相关属性
- (void)searchShortColumns
{
    _shortesIndex = [self p_indexForShortestColumn];
    CGFloat shortestH = [self.columnHeights[_shortesIndex] floatValue];
    // 计算x值：内边距left + （item宽 + item的间距）* 索引
    self.detalX = self.sectionInsets.left + (self.itemSize.width +self.insertItemSpacing) * _shortesIndex;
    // 计算y值
    self.detalY = shortestH + self.insertItemSpacing;
}
//第九步：查找最短的列，并设置相关属性
// 设置属性和frame
- (void)setFrame:(NSIndexPath *)indexPath
{
    // 设置属性
    UICollectionViewLayoutAttributes *layoutArr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    // 保存item的高
    CGFloat itemHeight = 0;
    if (_delegate && [_delegate respondsToSelector:@selector(heightItemForIndextPath:)]) {
        // 使用代理方法获取item的高
        itemHeight = [_delegate heightItemForIndextPath:indexPath];
    }
    // 设置frame
    layoutArr.frame = CGRectMake(_detalX, _detalY, self.itemSize.width, itemHeight);
    // 放入数组
    [self.itemAtrributes addObject:layoutArr];
    // 更新高度
    self.columnHeights[_shortesIndex] = @(_detalY +itemHeight);
}
//步骤十：在实现文件中必须要的实现三个方法
/*
 - (void)prepareLayout 准备布局方法,在每个UICollectionViewLayout将要被使用的时候调用这个方法
 - (CGSize)collectionViewContentSize  计算每个item的大小,会走很多次
 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 返回所有的item的位置信息和大小
 */
//第十一步：实现准备布局的代理方法
// 准备布局
- (void)prepareLayout
{
    // 调用父类布局
    [super prepareLayout];
    [self addHeightWithColumns];
    // 获取item的数量
    self.numberOfItems = [self.collectionView numberOfItemsInSection:0];
    // 为每一个item设置frame和indexPath
    for(int i = 0;i < self.numberOfItems;i++)
    {
        // 查找最短的列，并设置相关属性
        [self searchShortColumns];
        // 设置indexPath
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
        [self setFrame:indexPath];
    }
}
//第十二步:计算每个item 的大小
- (CGSize)collectionViewContentSize
{
    // 获取最长高度索引
    NSInteger longerstIndex = [self p_indexForLongestColumn];
    // 通过索引获取高度
    CGFloat longestH = [self.columnHeights[longerstIndex] floatValue];
    // 获取collectionView的Size
    CGSize contentSize = self.collectionView.frame.size;
    // 最大高度+bottom
    contentSize.height = longestH + self.sectionInsets.bottom;
    return contentSize;
}
//第十三步：将每个item的布局返回
// 返回每一个item的布局
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    // 返回每一个item的Attribute
    return self.itemAtrributes;
}

@end
